#include <iostream>
#include <boost/coroutine2/all.hpp>

// 协程函数，接收一个 sink 对象作为参数，用于输出数据
void fibonacci(boost::coroutines2::coroutine<int>::push_type& sink) {
    int a = 0, b = 1;
    while (true) 
    {
        sink(a);
        std::tie(a, b) = std::make_tuple(b, a + b);
        if (a > 100) break; // 限制输出前10个斐波那契数
    }
}

int main() {
    // 创建一个 pull 类型的协程对象，它将调用 fibonacci 函数
    boost::coroutines2::coroutine<int>::pull_type source(fibonacci);

    // 从协程中拉取并打印斐波那契数
    while (source) 
    {
        std::cout << "Main: " << source.get() << std::endl;
        source();
    }

    std::cout << std::endl;

    return 0;
}